<?php 
/**
 * ... ...
 * ... ...
 *
 */ 

/**
 * 视图类 JJ_ContactListView 
 *
 * @access public
 */
class JJ_ContactListView 
	//<<[UnmodifiableBlock.Start]::Extends And Implements::>>//
	extends JCAT_ViewGtk
	//<<[UnmodifiableBlock.End]::Extends And Implements::>>// 
{
	
	/**
	 * 构造函数 
	 *
	 * @access	public
	 * @param	$aParent	JCAT_IViewContainer		视图的父对象(父视图 或 控制器)。注意：视图不应单独存在，必须有一个父对象！ 
	 * @return	void
	 */
	public function JJ_ContactListView(JJ_MainWindow $aParent)
	{
		// 调用父类构造函数 
		$this->JCAT_ViewGtk('JJ_ContactListView','template.JJ_ContactListView.glade','JJ_ContactListView',$aParent) ;

		$this->Initialize() ;	
	}
	
	/**
	 * 初始化 视图 
	 *
	 * @access	protected
	 * @return	void
	 */
	protected function Initialize()
	{
		// 创建Gtk窗体 
		$this->Create() ;

		// 载入UI控件
		$this->AddUICtrl(new ContactList($this)) ;
		
		// 连接事件
		$aXMPPConn = JJ_MainController::GetCurrentXMPPConnect() ;	
		$aXMPPConn->set_handler('rosterupdate',$this,'OnRosterUpdate');
		
		
		// 欢迎界面
		$aSetting = JJ_Setting::GetGlobalInstance() ;
		$sProductName = $aSetting->GetItem('/JJ','ProductName') ;
		
		$wndLabWelcome = $this->GetChildWidget('LabWelcome') ;
		$wndLabWelcome->set_label("感谢您使用\r\n<span color='#008800'>{$sProductName}</span>") ;
		
		$this->DisplayWizard() ;
	}
	
	/**
	 * Description
	 *
	 * @access	public
	 * @return	JJ_MainWindow
	 */
	public function GetParent()
	{
		return parent::GetParent() ;
	}
	
	/**
	 * Description
	 *
	 * @access	public
	 * @return	JJ_MainController
	 */
	public function GetParentController()
	{
		return parent::GetParentController() ;
	}
	
	/**
	 * Description
	 *
	 * @access	public
	 * @return	array
	 */
	public function GetGroups()
	{
		$arrRetGroups = array() ;
		$aUICtrl = $this->GetUICtrl('ContactList') ;
		JCAT_ASSERT::ASSERT_INSTANCE($aUICtrl,'ContactList') ;
		
		$aIterator = $aUICtrl->CreateItemIterator(JCAT_UICtrlGtkTree::TOP_ITEM,-1) ;
		$aIterator->First() ;
		while( !$aIterator->IsDone() )
		{
			$aItem = $aIterator->Current() ;
			
			if( $aUICtrl->GetCellData($aItem,ContactList::CLM_NODETYPE) == ContactList::CLM_TYPE_GROUP )
			{
				$arrRetGroups[] = $aUICtrl->GetCellData($aItem,ContactList::CLM_NAME) ;
			}
			
			$aIterator->Next() ;
		}
		
		return $arrRetGroups ;
	}

	
	public function GetUserNickname(JJ_Account $aContact)
	{
		$aMainController = $this->GetParentController() ;
		$aXMPPConn = $aMainController->GetXMPPConnect() ;
		return isset($aXMPPConn->roster[$aContact->GetJabberAddress()])?
			$aXMPPConn->roster[$aContact->GetJabberAddress()]['name']:
			null ;
	}
		
	public function GetUserGroupName(JJ_Account $aContact)
	{
		$aMainController = $this->GetParentController() ;
		$aXMPPConn = $aMainController->GetXMPPConnect() ;
		return isset($aXMPPConn->roster[$aContact->GetJabberAddress()])?
			$aXMPPConn->roster[$aContact->GetJabberAddress()]['group']:
			null ;
	}
	
	/**
	 * 显示向导视图
	 *
	 * @access	public
	 * @return	void
	 */
	public function DisplayWizard()
	{
		$bNoContace = true ;
		$aContactList = $this->GetUICtrl('ContactList') ;
		$aIterator = $aContactList->CreateItemIterator(null,-1) ;
		$aIterator->First() ;
		while( !$aIterator->IsDone() )
		{
			$aItem = $aIterator->Current() ;
			
			if( $aContactList->GetCellData($aItem,ContactList::CLM_NODETYPE)==ContactList::CLM_TYPE_CONTACT )
			{
				$bNoContace = false ;
				break ;
			}
			
			$aIterator->Next() ;
		}
		
		if( $bNoContace )
		{
			$this->GetChildWidget('WizardView')->set_visible(true) ;
			$this->GetChildWidget('TreeContactList')->set_visible(false) ;
		}
		else
		{
			$this->GetChildWidget('WizardView')->set_visible(false) ;
			$this->GetChildWidget('TreeContactList')->set_visible(true) ;
		}
	}
	
	/**
	 * 更新 一个联系人状态
	 *
	 * @access	public
	 * @param	$Parameter
	 * @return	void
	 */
	public function OnRosterUpdate($sJID,$bNew)
	{
		// 为联系人 创建一个 账号对象
		$aContactAccount = JJ_Account::CreateFromString($sJID) ;
		if(!$aContactAccount)
		{
			return ;
		}
		
		//
		$sContactAddress = $aContactAccount->GetJabberAddress() ;
		$aXMPPConn = JJ_MainController::GetCurrentXMPPConnect() ;		
		if( !isset($aXMPPConn->roster[$sContactAddress]) )
		{
			return ;
		}
		$arrStatus = $aXMPPConn->roster[$sContactAddress] ;
		
		$aContactList = $this->GetUICtrl('ContactList') ;
		JCAT_ASSERT::ASSERT_INSTANCE($aContactList,'ContactList') ;
			
		// 删除
		if( $arrStatus['subscription']=='remove' or $arrStatus['ask']=='unsubscribe' )
		{
			$aItem = $this->GetItemForContact($sContactAddress) ;
			if($aItem)
			{
				$aModel = $aContactList->GetGtkModel() ;
				
				// 所属分组 Item
				$sPath = $aModel->get_string_from_iter($aItem) ;
				$arrPath = explode(':',$sPath) ;
				if( count($arrPath)==2 )
				{
					$aGroupItem = $aModel->get_iter_from_string($arrPath[0]) ;
				}
				else 
				{
					$aGroupItem = null ;
				}
			
				// 删除 改联系人 Item
				$aContactList->RemoveItem($aItem) ;
				
				// 删除空 分组
				if( $aGroupItem and $aModel->iter_n_children($aGroupItem)==0 )
				{
					$aContactList->RemoveItem($aGroupItem) ;
				}
			}
		}
		
		// 更新 或 添加
		else 
		{
	
			$sGroupName = $arrStatus['group'] ;
			$sShow = $arrStatus['show']? $arrStatus['show']: 'invisible' ;
			$sContactDisplayName = $aContactAccount->GetDisplayName($arrStatus['name']) ;
			if( $arrStatus['status'] )
			{
				$sContactDisplayName.= "[{$arrStatus['status']}] " ;
			}
			
			// Item 图标
			$sIconPath = ROOT_PATH."Resource/Image/Status/22/{$sShow}.png" ;
			if( !file_exists($sIconPath) )
			{
				$sIconName = $sShow=='off'? 'offline': 'available' ;
				$sIconPath = ROOT_PATH."Resource/Image/Status/22/{$sIconName}.png" ;
			}
	
			// 已存在 的 联系人
			$aContactItem = $this->GetItemForContact($sContactAddress) ;
			if($aContactItem)
			{
				// 删除旧 Item
				$aContactList->RemoveItem($aContactItem) ;
			}
			
			// 所属分组 的 Item
			if( trim($sGroupName) )
			{
				$aGroupItem = $this->GetItemForGroup($sGroupName) ;
				
				// 新建联系人分组
				if(!$aGroupItem)
				{
					$aGroupItem = $aContactList->AppendItem(array(
						ContactList::CLM_TYPE_GROUP, $sGroupName
						, ROOT_PATH."Resource/Image/group_22x22.png", $sGroupName
					)) ;
				}
			}
	
			// 无分组用户
			else 
			{
				$aGroupItem = null ;
			}
			
			// 创建 联系人 Item
			$aContactList->AppendItem(array(
				ContactList::CLM_TYPE_CONTACT
				, $sContactAddress, $sIconPath, $sContactDisplayName
			),$aGroupItem) ;
			
		
		}
			
		// 显示 向导
		$this->DisplayWizard() ;
	}
	

	/**
	 * 响应 删除联系人 事件
	 *
	 * @access	public
	 * @return	void
	 */
	public function OnRemoveContact()
	{
		$wndTree = $this->GetChildWidget('TreeContactList') ;
		$aSelection = $wndTree->get_selection() ;
		list($aModel,$aItem) = $aSelection->get_selected() ;
		if(!$aItem)
		{
			return ;
		}
		
		$sContactJID = $aModel->get_value($aItem,ContactList::CLM_JID) ;
		$sContactName = $aModel->get_value($aItem,ContactList::CLM_NAME) ;
		
		if( !JCAT_Gtk::ConfirmDialog(JCAT_Language::Sentence('确定要删除联系人：%s 吗？',$sContactName)) )
		{
			return ;
		}
		
		// 删除 联系人
		$aMainController = $this->GetParentController() ;
		$aMainController->RemoveContact($sContactJID) ;
	}

	
	/**
	 * 响应鼠标点击 事件
	 *			
	 * @access	public
	 * @return	void
	 */
	public function OnItemButtonPress(GtkWidget $wndTree, GdkEvent $aEvent)
	{
		// 双击
		if( $aEvent->type == Gdk::_2BUTTON_PRESS )
		{
			$this->OnStartSession() ;
		}
		
		// 右键
		if( $aEvent->button===3 and $aEvent->type == Gdk::BUTTON_PRESS )
		{
			$this->PopRightMenu() ;
		}
	}
	
	/**
	 * 弹出 右键 菜单
	 *
	 * @access	protected
	 * @return	void
	 */
	protected function PopRightMenu()
	{
		// 当前 Item
		$wndTree = $this->GetChildWidget('TreeContactList') ;
		$aSelection = $wndTree->get_selection() ;
		list($aModel,$aItem) = $aSelection->get_selected() ;
		if(!$aItem)
		{
			return ;
		}
		
		// 分组
		if($aModel->get_value($aItem,ContactList::CLM_NODETYPE)!=ContactList::CLM_TYPE_CONTACT)
		{
			return ;
		}
		
		// 联系人
		$sJID = $aModel->get_value($aItem,ContactList::CLM_JID) ;
		$aContact = JJ_Account::CreateFromString($sJID) ;
		
		// 创建菜单
		$aWidgetCreator = $this->GetCreator() ;
		$wndMenu = $aWidgetCreator->GetWidget('UserMenu',array(
					'TheView'=>$this
					, 'TheController'=>$this->GetParentController())) ;
		JCAT_ASSERT::ASSERT_INSTANCE($wndMenu,'GtkMenu');
		
		$wndParentMenu = $aWidgetCreator->GetWidget('GroupList') ;
		
		// 清除 已经加载的 菜单项
		$arrMenuItems = $wndParentMenu->get_children() ;
		array_shift($arrMenuItems);	// “新建分组”
		array_shift($arrMenuItems);	// “无分组”
		array_shift($arrMenuItems);	//  分隔条
		foreach ($arrMenuItems as $wndMenuItem)
		{
			$wndMenu->remove($wndMenuItem) ;
			$wndMenuItem->set_visible( false ) ;
		}
		
		
		// 加载 分组子菜单
		$arrExistsGroups = $this->GetGroups() ;
		foreach ($arrExistsGroups as $sGroupName)
		{
			$wndMenuItem = new GtkMenuItem($sGroupName) ;
			$wndMenuItem->set_visible( true ) ;
			$wndMenuItem->connect_simple('activate',array($this,'OnMoveGroup'),$aContact,$sGroupName,$aModel,$aItem);
			$wndParentMenu->append($wndMenuItem) ;
		}
		
		// 弹出
		$wndMenu->popup() ;
	}
	
	
	/**
	 * 转移联系人
	 *
	 * @access	public
	 * @return	void
	 */
	public function WithoutGroup()
	{
		// 当前 Item
		$wndTree = $this->GetChildWidget('TreeContactList') ;
		$aSelection = $wndTree->get_selection() ;
		list($aModel,$aItem) = $aSelection->get_selected() ;
		if(!$aItem)
		{
			return ;
		}
		$sJID = $aModel->get_value($aItem,ContactList::CLM_JID) ;
		$aContact = JJ_Account::CreateFromString($sJID) ;
		
		$this->OnMoveGroup($aContact,'',$aModel,$aItem) ;
	}
	
	/**
	 * 转移联系人
	 *
	 * @access	public
	 * @return	void
	 */
	public function OnChangeNickname()
	{
		$aContactList = $this->GetUICtrl('ContactList') ;
		$aItem = $aContactList->GetFirstSelectedItem() ;
		$aContactList->EditCell($aItem,ContactList::CLM_NAME) ;
	}
	
	/**
	 * Description
	 *
	 * @access	public
	 * @return	void
	 */
	public function OnOpenSessionHistoryDialog()
	{
		// 显示历史记录 对话框
		$aMainController = $this->GetParentController() ;
		$aDialog = $aMainController->GetSessionHistoryDialog() ;
		$aDialog->ShowView(true) ;
		
		$aContact = $this->GetSelectedContact() ;
		$aDialog->LoadSessionHistory($aContact,date('Y.m.d')) ;
	}
	
	/**
	 * Description
	 *
	 * @access	public
	 * @return	JJ_Account
	 */
	public function GetSelectedContact()
	{
		$wndTree = $this->GetChildWidget('TreeContactList') ;
		$aSelection = $wndTree->get_selection() ;
		list($aModel,$aItem) = $aSelection->get_selected() ;
		if(!$aItem)
		{
			return null ;
		}
		
		if( $aModel->get_value($aItem,ContactList::CLM_NODETYPE)===ContactList::CLM_TYPE_GROUP )
		{
			return null ;
		}
		else 
		{
			$sContactJID = $aModel->get_value($aItem,ContactList::CLM_JID) ;
			return JJ_Account::CreateFromString($sContactJID) ;
		}
	}
	
	/**
	 * 转移联系人
	 *
	 * @access	public
	 * @return	void
	 */
	public function OnMoveGroup(JJ_Account $aContact,$sToGroup,$aModel,$aItem)
	{
		// 联系人分组 Item
		$sPath = $aModel->get_string_from_iter($aItem) ;
		$arrPath = explode(':',$sPath) ;
		if( count($arrPath)==2 )
		{
			$aGroupItem = $aModel->get_iter_from_string($arrPath[0]) ;
		}
		else 
		{
			$aGroupItem = null ;
		}
		
		// 删除空 分组
		if( $aGroupItem and $aModel->iter_n_children($aGroupItem)==1 )
		{
			$aModel->remove($aGroupItem) ;
		}
		
		$aMainController = $this->GetParentController() ;
		$atXMPPConn = $aMainController->GetXMPPConnect() ;

		$sUserNickname = $this->GetUserNickname($aContact) ;
		$atXMPPConn->roster_update($aContact->GetJabberAddress(),$sUserNickname,$sToGroup) ;
	}
	
	
	/**
	 * 开始 将联系人 转移到 新的分组
	 *
	 * @access	public
	 * @return	void
	 */
	public function StartMoveToNewGroup()
	{
		// 当前 Item
		$wndTree = $this->GetChildWidget('TreeContactList') ;
		$aSelection = $wndTree->get_selection() ;
		list($aModel,$aItem) = $aSelection->get_selected() ;
		if(!$aItem)
		{
			return ;
		}
		$sJID = $aModel->get_value($aItem,ContactList::CLM_JID) ;
		$aContact = JJ_Account::CreateFromString($sJID) ;
		
		
		$aContactList = $this->GetUICtrl('ContactList') ;
		
		// 创建一个新的分组
		$sNewGroupName = JCAT_Language::Sentence('新建联系人分组') ;
		$aNewGroupItem = $aContactList->AppendItem(array(
						ContactList::CLM_TYPE_GROUP, $sNewGroupName
						, ROOT_PATH."Resource/Image/group_22x22.png", $sNewGroupName)) ;
		
		// 绑定事件
		$aContactList->RegisterEventProcessFunction('TreeContactList-edited',array($this,'EndMoveToNewGroup'),array($aContact,$aModel,$aItem)) ;
		
		// 开始编辑 新分组的名称
		$aContactList->CanEditGroupName(true) ;
		$aContactList->EditCell($aNewGroupItem,ContactList::CLM_NAME);		
	}
	
	/**
	 * what's this
	 * 
	 * @access	public
	 * @param	$aRenderer		GtkCellRendererText		what's this
	 * @param	$sPath			string					what's this
	 * @param	$sNewText		string					what's this
	 * @param	$nColumn		int						what's this
	 * @return	void
	 */
	public function EndMoveToNewGroup()
	{
		list(,$sPath,$sNewText,,$aContactList,$aContact,$aModel,$aItem) = func_get_args() ;
		
		// 删除 填写 新组名 的 Item
		$aNewGroupItem = $aModel->get_iter_from_string($sPath) ;
		$aModel->remove($aNewGroupItem) ;

		// 取消 分组可编辑
		$aContactList->CanEditGroupName(false) ;
		
		// 取消事件响应
		$aContactList->UnregisterEventProcessFunction('TreeContactList-edited',array($this,'EndMoveToNewGroup')) ;

		// 转移 联系人
		$this->OnMoveGroup($aContact,$sNewText,$aModel,$aItem) ;
	}
	
	/**
	 * 与某个联系人开始会话
	 *
	 * @access	public
	 * @return	void
	 */
	public function OnStartSession()
	{
		$wndTree = $this->GetChildWidget('TreeContactList') ;
		$aSelection = $wndTree->get_selection() ;
		list($aModel,$aItem) = $aSelection->get_selected() ;
		if(!$aItem)
		{
			return ;
		}
		
		$bIsContact = ($aModel->get_value($aItem,ContactList::CLM_NODETYPE)==ContactList::CLM_TYPE_CONTACT) ;
		if($bIsContact)
		{
			$sJID = $aModel->get_value($aItem,ContactList::CLM_JID) ;
			$aAccount = JJ_Account::CreateFromString($sJID) ;
			
			$aSessionWindow = JJ_SessionWindow::GetInstance(
					$aAccount
					, $this->GetParentController()
			) ;
			
			if($aSessionWindow)
			{
				$aSessionWindow->ShowView() ;
			}
		}
	}
	
	
	/**
	 * 复制 用户完整地址
	 *
	 * @access	public
	 * @param	$Parameter
	 * @return	void
	 */
	public function OnCopyUserAddress()
	{
		$wndTree = $this->GetChildWidget('TreeContactList') ;
		$aSelection = $wndTree->get_selection() ;
		list($aModel,$aItem) = $aSelection->get_selected() ;
		if(!$aItem)
		{
			return ;
		}

		$bIsContact = ($aModel->get_value($aItem,ContactList::CLM_NODETYPE)==ContactList::CLM_TYPE_CONTACT) ;
		if($bIsContact)
		{
			$aClipboard = new GtkClipboard($wndTree->get_display(),Gdk::atom_intern('CLIPBOARD'));
			$aClipboard->set_text($aModel->get_value($aItem,ContactList::CLM_JID));
		}
	}
	
	/**
	 * 取得联系人对应的 Item
	 *
	 * @access	public
	 * @return	GtkTreeIter
	 */
	public function GetItemForGroup($sGroupName)
	{
		return $this->GetItem($sGroupName,ContactList::CLM_TYPE_GROUP) ;
	}

	/**
	 * 取得联系人对应的 Item
	 *
	 * @access	public
	 * @return	GtkTreeIter
	 */
	public function GetItemForContact($sJID)
	{
		return $this->GetItem($sJID,ContactList::CLM_TYPE_CONTACT) ;
	}
	
	/**
	 * 取得 Item
	 *
	 * @access	protected
	 * @param	$Parameter
	 * @return	GtkTreeIter
	 */
	protected function GetItem($sItemName,$sNodeType)
	{
		$sItemName = strtolower($sItemName) ;
		
		$aUICtrl = $this->GetUICtrl('ContactList') ;
		JCAT_ASSERT::ASSERT_INSTANCE($aUICtrl,'ContactList') ;
		
		$aIterator = $aUICtrl->CreateItemIterator(JCAT_UICtrlGtkTree::TOP_ITEM,-1) ;
		$aIterator->First() ;
		while( !$aIterator->IsDone() )
		{
			$aItem = $aIterator->Current() ;
			
			if( $aUICtrl->GetCellData($aItem,ContactList::CLM_NODETYPE) == $sNodeType )
			{
				$sOldName = strtolower($aUICtrl->GetCellData($aItem,ContactList::CLM_JID)) ;
				if( $sOldName==$sItemName )
				{
					return $aItem ;
				}
			}
			
			$aIterator->Next() ;
		}
		
		return null ;
		
	}
}

?><?
/**
 * [注意!!]
 *	以下内容由 JCAT PHP Toolbox 自动维护，手动更改的内容会被 JCAT PHP Toolbox 抹除，
 *	同时还可能破坏格式，导致 JCAT PHP Toolbox 无法正常读取。
 */
/*<<[UnmodifiableBlock.Start]::Coder Dialog Data::>>&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//
<<{{DocumentClass:ViewGtkDoc}}>>
eCVEQSU5RFQlQ0IlOTIlREE4JTE0JURET1UlM0UlMjIlRkUlODAlRjglRDElRjYlMjRjUiVBOSUwMiUzRiVCQSVBQyVCNEwlMDQlOTYlMDglRDklQTQlM0MlQTAlMDJhYXolQjBTNCVFRSVFMiVERiVFN0hNJUY3JTJDJUQyJUM5YiUxNi5JJUY3cSVFRSVCOSVFNyU1RSVBOCVFMyslN0UlRUMlRTIwdiVEMiVCQSVBRiU5
RFElMUQlQkY3byVGRiUyNnYlODQlOTIlQTdEJUQ3JTVEVyVENiU3QiVFOSU4QyU2MCUwQ2IlODclMjQlRTMlRUElQkIlRjElREMlRjYlOEQlQjUlMjElOTMlMTclOTUlREMlREYlRUIlQkElOTdfJUVBJTdFayVBQyUxRiVGQyVEOHElQjclODclQkR0ay0lQTUlRkIlRTV4JUQ4JUM5VSVFRiUxMiU5OSVENCVCRCVCQiVE
QiVCOTMlRDklMUQlN0UlMUNXJUQyJUZEJTJGJUQ1JUVEJUFGJTk3dyU4NCU3Q08lMEVtXyVBRiVGQSUzQiVENSVGNSVBNiVENiVCQiU4RCVBRSVENyUyRiUxNGglQUQlREElODVab2RfJUE0JUQ2JUY2JTAxJUI0JTdFJUNBJUIxJTFFdFElQjQlQ0YlMTVSdSVCNCVDNiVEOCVGMS0lQzclQTclMEVfJTlBJUZCJTI1JUNB
NSVGMCVCOSVCNyUzRiVDMyVERiVGN2YlMjUlOTMlOUQlQkIyJUU3ayVDRCVEQ28lRUZtJUMxJUJGJTQwJTBFJUNDJUU0JTVFJUI2JTdEVyUxOFclN0U4JUVFJTlEUTklQkElRDglQTIlQzlWJUU5JUY1USVCNmYlMjglMTglOTIlOEElM0QlNUNuJUNDdCVBMiVEOCVCMSVFOCVDRiVCQ3klOTElRjRHbSVFQiVBOFYlMUUl
RDMlQzMlQ0F4JUMwJUIzJTdEbi4lN0MlMDl6JTAxJUI1JTAxayUzQnQrJUZBJTVFJUVDJTdDJUZDJUY4JUY4JTg4JURDJTFGJTg2JTkwJUVEJTIyJUZFJTE5JUY4ciVGOSVGNCVFOSVDRCUxRjIlMTElMTklRTMlOURmJTNCdiUyNiVCQyVGMCUwOCVDRiUyN3dKJTI0JUU1JUFFJTgwLSU5RiVBRiU5QUYlRDMlQTYlMjQl
MjIlMTElMDltQiUzRE0lOTklOUUlRUQlQzYlM0QlRTJSUjUlMUUlQTl0SiUwNzJwJUM1QyUyNiUwQSVGOCVBOGYlRDVEJUMxJTE3JTA5JUM1TyVBNSVFMiUxRU14JTg4JUYzJTNDJTlEJUUzJUNDJUYzJUVFJURCYiVBM2klQkElRTUlODh5JTQwJUZFJUFEOCVGMyU4OCUyQSUxRU0lMTMlRUUlQjMlQjMlQzglQ0QlOUQl
RkElOEQuJUI5JUMxJTIyJTBEYiVCMnolQzElOTElODMlQkMlQUElQzAlRjklRUQlMUYlQzIlOTclREUlQUElNURqJTlBUXAlMDIlQzdsJTg5JURBJUMyJUJCJUIzdUQlQ0ElQkVmJUUwJUJEJUQ0bDAlM0UlRTQlRUUlRjQlRTdqJTBFJTNFJUYwJTgxJUM3JTAzJUMzJTlELiVCOCVFOSUyMyVCQiVGNiU5MSVFMyU5RSU5
QlolQzAlM0UlOTFqJTlEJTEyJUNFJTA3JUMyJTA1JUVDJUQ5JTBEJUE5SiVEOCVEOSU0MCUyQXZaJTJBJTkxJURBJUJFUiVENEglMjklRUElODAlRDMlMEU1JUFBJUIxJTlFJTk5NzRiJUMzJTA2JTk4JUUzJUEwViVFMiVCNkQlM0MlM0IlRjMzUyUxMSUyMSVCQ0wlRTclNUUlODglQkElMkMrJUQ1JTA2eE0lMDglRkMl
OTMlRDElQzFoJTg5JUY3JUIweCVEMmElODIlOUMlQjAlMEMlOTglOUVWJTFDWiU4OCVDOSUwQyUxQSVEMzklQjRpJUMxJUJCMjklRTMlQTclMEZaJUUwJTBEJUJDJTEyJUZDJUQ3JTg5MyVCQSVBOCVEOCU3Rm0lQzUlODIlRTglRTl3T0UyJUZEJURCJTJDJUZCJUVGNi0lQjglRkVxJUJDJUJFZ0ElRTglQkYlQjZnJUJG
RCVGRiU3RiVFQmYlRTMlQUExYiU5NyUwRndzJTJCSVQlMjYlM0NiJTAzJTNEJUFGJUZDQk8lQjMlN0MlMEUlREZ1JTJDJTE4JUFGJUM2JTFBJUE0JTFDeSVGOCUwNiVCMSU4MCVDNEYlRTYlNDA0JTA3JTNEJUUzJTNDQmw0JUM3JTFBTiUyQiVBQyU5NyVDNyVFRCVFQSVCMCUxRCUzRSVCQyVEOSVDMCUyMSVFNyUwNjEl
QjMlQzklMDJYJUQ0cCUzRCU4QiUwQyU5MiUzRiU2MG1yJTNBJTdFJUZCJTE2JUQyJTVFLiVGRiUwMi0lMTMlQ0IlM0M!
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&<<[UnmodifiableBlock.End]::Coder Dialog Data::>>*/
?>